package com.xbts.system.service;

import com.alibaba.fastjson2.JSONObject;
import com.huaweicloud.sdk.bss.v2.model.*;
import com.huaweicloud.sdk.ecs.v2.model.*;
import com.huaweicloud.sdk.eip.v2.model.ListPublicipsRequest;
import com.huaweicloud.sdk.eip.v2.model.PublicipShowResp;
import com.huaweicloud.sdk.iam.v3.model.Domains;
import com.huaweicloud.sdk.iam.v3.model.KeystoneListProjectsResponse;
import com.huaweicloud.sdk.ims.v2.model.CreateImageResponse;
import com.huaweicloud.sdk.ims.v2.model.ListImagesResponse;
import com.huaweicloud.sdk.vpc.v2.model.CreateSubnetRequest;
import com.huaweicloud.sdk.vpc.v2.model.CreateSubnetResponse;
import com.huaweicloud.sdk.vpc.v2.model.ListSubnetsResponse;
import com.huaweicloud.sdk.vpc.v2.model.ListVpcsResponse;
import com.xbts.common.core.domain.AjaxResult;
import com.xbts.system.domain.CnRegion;
import com.xbts.system.domain.dto.*;

import java.util.List;
import java.util.Map;

public interface ICloudServiceService {

    /**
     * 查询可用区列表
     * @param regionId 区域id
     * @return 可用区列表
     */
    NovaListAvailabilityZonesResponse novaListAvailabilityZones(String regionId);

    /**
     * 获取云服务器规格列表
     * @param listFlavorsRequestDTO  请求参数
     * @return 云服务器规格列表
     */
    List<Flavor> listFlavors(ListFlavorsRequestDTO listFlavorsRequestDTO);

    /**
     * 查询包年/包月产品价格
     *
     * @param rateOnPeriodReq
     */
    Map<String, Object> listRateOnPeriodDetail(RateOnPeriodReqDTO rateOnPeriodReq);

    /**
     * 查询镜像列表
     *
     * @param listImagesRequest
     * @return 镜像列表
     */
    ListImagesResponse glanceListImages(ListImagesRequestDTO listImagesRequest);

    /**
     * 查询镜像列表
     * @param createImageRequestDTO 请求参数
     * @return 镜像列表
     */
    CreateImageResponse createImage(CreateImageRequestDTO createImageRequestDTO);

    /**
     * 查询网络列表
     * @param regionId 区域id
     * @return 网络列表
     */
    JSONObject networks(String regionId);

    /**
     * https://support.huaweicloud.com/api-vpc/vpc_api01_0003.html
     * 查询VPC列表
     * @param regionId 请求参数
     * @return
     */
    ListVpcsResponse listVpcs(String regionId);

    /**
     * 创建云服务器
     * @param prePaidServerDTO 请求参数
     * @return 云服务器创建结果
     */
    AjaxResult createServers(PrePaidServerDTO prePaidServerDTO);

    /**
     * https://support.huaweicloud.com/api-ecs/ecs_02_0101.html
     * 查询子网列表
     * @param listSubnetsRequestDTO 请求参数
     * @return
     */
    ListSubnetsResponse listSubnets(ListSubnetsRequestDTO listSubnetsRequestDTO);

    /**
     * https://support.huaweicloud.com/api-ecs/ecs_02_0901.html
     * 查询任务的执行状态
     * @param jobId 请求参数
     * @param regionId 请求参数
     * @return
     */
    ShowJobResponse showJob(String jobId, String regionId);

    /**
     * 查询按需产品价格
     * @param rateOnDemandReq
     * @return
     */
    ListOnDemandResourceRatingsResponse listOnDemandResourceRatings(RateOnDemandReqDTO rateOnDemandReq);

    /**
     * 购买云服务器
     * @param buyServerDto
     * @return 购买结果
     */
    AjaxResult buyServer(BuyServerDto buyServerDto);

    /**
     * 购买服务器（对公账号购买）
     *
     * @param ids  购物车数组
     * @param filePath 支付信息凭证
     * @return
     */
    AjaxResult buyServerByCorporate(List<String> ids, String filePath);

    /**
     * 查询指定条件下的项目列表
     * @return 项目列表
     */
    KeystoneListProjectsResponse keystoneListProjects();

    /**
     * 得到价格查询参数
     * @param listFlavorsResponseDTO 请求参数
     * @return 价格查询参数
     */
    List<PeriodProductInfo> getFlavorsParams(ListFlavorsResponseDTO listFlavorsResponseDTO);

    /**
     * 获取用户信息
     * @return 用户信息
     */
    String keystoneCreateUserTokenByPassword();

    /**
     * 查询云服务器规格变更支持列表
     * @param listResizeFlavorsRequestDTO 请求参数
     * @return 云服务器规格变更支持列表
     */
    AjaxResult listResizeFlavors(ListResizeFlavorsRequestDTO listResizeFlavorsRequestDTO);

    /**
     * 变更云服务器规格
     * @param resizeServerRequestDTO 请求参数
     * @return 变更结果
     */
    AjaxResult resizeServer(ResizeServerRequestDTO resizeServerRequestDTO);

    /**
     * 查询IAM用户可以访问的账号详情
     * @return 账号详情
     */
    Domains keystoneListAuthDomains();

    /**
     * 全量查询弹性公网IP列表
     * @param regionIdDTO   请求参数
     * @return 弹性公网IP列表
     */
    List<PublicipShowResp> listPublicips(RegionIdDTO<ListPublicipsRequest> regionIdDTO);

    /**
     * https://support.huaweicloud.com/api-oce/api_order_00021.html
     * 查询客户包年/包月资源列表
     * @return 查询客户包年/包月资源列表
     */
    ListPayPerUseCustomerResourcesResponse listPayPerUseCustomerResources(ListPayPerUseCustomerResourcesRequest listPayPerUseCustomerResourcesRequest);

    /**
     * https://support.huaweicloud.com/api-ecs/ecs_02_0103.html
     * 删除云服务器
     * @return 删除云服务器
     */
    DeleteServersResponse deleteServers(RegionIdDTO<DeleteServersRequest> regionIdDTO);

    /**
     * 取消包年/包月资源自动续费
     * @param cancelAutoRenewalResourcesRequest 请求参数
     * @return 取消结果
     */
    CancelAutoRenewalResourcesResponse cancelAutoRenewalResources(CancelAutoRenewalResourcesRequest cancelAutoRenewalResourcesRequest);

    /**
     * 查询区域列表
     * @return 区域列表
     */
    List<CnRegion> regionList();

    /**
     * 查询变更差价
     * @param rateOnPeriodReq 请求参数
     * @return 区域列表
     */
    Map<String, Object> resizeFlavorPrice(RateOnPeriodReqDTO rateOnPeriodReq);

    /**
     * https://support.huaweicloud.com/api-vpc/vpc_subnet01_0001.html
     * 查询子网列表
     * @param regionIdDTO 请求参数
     * @return
     */
    CreateSubnetResponse createSubnet(RegionIdDTO<CreateSubnetRequest> regionIdDTO);
}
